package org.xiaoxin.onecoupon.merchant.admin.service.basic.log;

import cn.hutool.core.util.StrUtil;
import com.mzt.logapi.beans.LogRecord;
import com.mzt.logapi.context.LogRecordContext;
import com.mzt.logapi.service.ILogRecordService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.xiaoxin.onecoupon.merchant.admin.common.context.UserContext;
import org.xiaoxin.onecoupon.merchant.admin.dao.entity.CouponTemplateLogDO;
import org.xiaoxin.onecoupon.merchant.admin.dao.mapper.CouponTemplateLogMapper;
import java.util.List;
import java.util.Optional;

/**
 * @author xiaoxin
 * 2025/4/15
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class DBLogRecordServiceImpl implements ILogRecordService {

   private final CouponTemplateLogMapper couponTemplateLogMapper;
   @Override
   public void record(LogRecord logRecord) {
      /**
       * .originalData(Optional.ofNullable(LogRecordContext.getVariable("originalData")).map(Object::toString).orElse(null))
       * 1.LogRecordContext.getVariable("originalData") 获取originalData值
       * 2.Optional.ofNullable使用 Optional.ofNullable 包装这个值：如果值为 null，返回一个空的 Optional。如果值非空，返回一个包含该值的 Optional。
       * 3.map(Object::toString)如果 Optional 是空的，map 不会执行任何操作，直接返回空的 Optional，
       *  如果Optional 非空：调用 Object::toString 方法，将 Optional 中的值转换为字符串。返回一个新的 Optional，其中包含转换后的字符串。
       * 4 ..orElse(null) 如果 Optional 是空的返 回 null 如果 Optional 非空，返回 Optional 中的值
       *
       *
       *
       */
      try {
         switch (logRecord.getType()){
            case "CouponTemplate":{
               CouponTemplateLogDO couponTemplateLogDO = CouponTemplateLogDO.builder()
                       .couponTemplateId(logRecord.getBizNo())
                       .shopNumber(UserContext.getShopNumber())
                       .operatorId(UserContext.getUserId())
                       .operationLog(logRecord.getAction())
                       .originalData(Optional.ofNullable(LogRecordContext.getVariable("originalData")).map(Object::toString).orElse(null))
                       .modifiedData(StrUtil.isBlank(logRecord.getExtra()) ? null : logRecord.getExtra())
                       .build();
               couponTemplateLogMapper.insert(couponTemplateLogDO);
            }
         }
      }catch (Exception ex){
         log.error("记录[{}]操作日志失败", logRecord.getType(), ex);
      }
   }

   @Override
   public List<LogRecord> queryLog(String bizNo, String type) {
      return List.of();
   }

   @Override
   public List<LogRecord> queryLogByBizNo(String bizNo, String type, String subType) {
      return List.of();
   }
}
